package analyzer;

import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queries.CommonTermsQuery;
import org.apache.lucene.search.*;
import org.apache.lucene.store.MMapDirectory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.file.Paths;

import static org.apache.lucene.tests.util.LuceneTestCase.*;

@Slf4j
public class SmartChinessAnalyzerDemo {
    MMapDirectory mMapDirectory = null;
    IndexWriter indexWriter =null;

    @BeforeEach
    public void setUp(){
        String uri = "F:\\integration\\search\\lucene-data\\smartcn";
        try {
            mMapDirectory = new MMapDirectory(Paths.get(uri));
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig();
            indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
            SmartChineseAnalyzer smartChineseAnalyzer = new SmartChineseAnalyzer();
            indexWriter = new IndexWriter(mMapDirectory, new IndexWriterConfig(smartChineseAnalyzer));

        } catch (IOException e) {
            throw new RuntimeException("mmap failed");
        }

    }
    @AfterEach
    public void destroyDown(){
        try {
            mMapDirectory.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public void index() throws IOException {

        String[] docs =
                new String[]{
                        "10月28日，上海市召开全市领导干部会议。中共中央政治局常委李强主持会议并讲话。中央组织部部长陈希同志出席会议并宣布中央决定：李强同志不再兼任上海市委书记、常委、委员职务，陈吉宁同志兼任上海市委委员、常委、书记。中共中央政治局委员、上海市委书记陈吉宁出席会议并讲话。上海市委副书记、市长龚正在会上发言。", // 0
                        "李强在讲话时表示，坚决拥护中央决定。他说，中央决定陈吉宁同志兼任上海市委书记，充分体现了以习近平同志为核心的党中央对上海工作、对上海领导班子建设的高度重视。陈吉宁同志政治上清醒坚定，政治意识、大局意识、核心意识、看齐意识强，坚决贯彻落实党中央决策部署，自觉在思想上政治上行动上同以习近平同志为核心的党中央保持高度一致。先后担任中管高校、国家部委、直辖市主要领导，领导经验丰富，有国际化视野和前瞻性思维，改革创新意识和推动发展的能力强。相信陈吉宁同志一定能团结带领全市广大干部群众把上海各方面工作做得更好，不断开创上海改革开放和现代化建设新局面。",
                        "李强说，党的十九大以来，习近平总书记连续多次亲临上海，出席重大活动、考察指导工作，对上海发展作出重要指示、寄予殷殷嘱托。我们把学习贯彻习近平总书记考察上海重要讲话精神作为全部工作的鲜明主题和贯穿始终的突出主线，奏响了“牢记嘱托、砥砺奋进”这个新时代上海发展的最强音。五年来，上海改革开放、创新发展迈出新步伐，经济总量连续跨过3万亿元、4万亿元两个大台阶，“五个中心”建设取得重要阶段性成效，人民城市建设全面展开，民心工程加快实施，科技、教育、文化、卫生等各项事业蓬勃发展，民主法治建设扎实推进，生态环境质量显著改善，城市治理现代化实践探索不断推进，党的建设全面加强，上海这座城市在发展前进中实现了软实力与硬实力的同步提升。今年上半年，我们勠力同心、顽强拼搏，打赢了大上海保卫战，彰显了人民城市生生不息的磅礴力量。经过全市上下不懈努力，上海发展跃上了新的更高平台。",
                        "李强向一起团结共事、真诚相待的四套班子成员，向给予大力支持、热情帮助的老领导老同志，向开拓进取、埋头苦干的全市广大干部群众，向风雨同舟、肝胆相照的各民主党派、工商联和无党派人士，向携手奋进、一起拼搏的中央驻沪各单位、直属各高校的同志们，向亲如一家、鼎力相助的驻沪解放军和武警官兵表示衷心感谢和崇高敬意。他说，上海之所以始终在时代发展的大潮中走在前列、勇立潮头，成功秘诀和制胜法宝就在于习近平总书记亲自概括提炼的海纳百川、追求卓越、开明睿智、大气谦和的城市精神和开放、创新、包容的城市品格。这是上海发展生生不息的力量源泉，是上海干部群众干事创业、成就梦想的真实写照。上海是一座流淌着红色血脉的光荣城市，是领风气之先的标杆城市，在上海工作既要有更加强烈的使命感，又必须始终怀着一颗敬畏之心；上海干部眼界宽、办法多、作风实，与同志们并肩战斗，踏实放心，受益良多；上海人民识大体、顾大局、热爱生活、勤勉坚韧，为上海人民服务，备感荣幸。五年来，我与上海干部群众结下的深情厚谊，在上海这座城市留下的难忘记忆，已成为我人生中值得倍加珍视的宝贵财富。今后我无论身在何处，都会心系上海、情系上海，关注上海、支持上海。衷心祝愿上海明天更加美好，上海人民生活更加美好。"
                };

// 文言文 对于smartcn 来说， 不识别。
//        String[] docs =
//                new String[]{
//                        "先帝创业未半而中道崩殂，今天下三分，益州疲弊，", // 0
//                        "此诚危急存亡之秋也。然侍卫之臣不懈于内，忠志之士忘身于外者，盖追先帝之殊遇，", // 1
//                        "欲报之于陛下也。诚宜开张圣听，以光先帝遗德，恢弘志士之气，", // 2
//                        "不宜妄自菲薄，引喻失义，以塞忠谏之路也。", // 3
//                };
        for (int i = 0; i < docs.length; i++) {
            Document doc = new Document();
            doc.add(newStringField("id", "" + i, Field.Store.YES));
            doc.add(newTextField("field", docs[i], Field.Store.YES));
            indexWriter.addDocument(doc);
        }

        DirectoryReader reader = DirectoryReader.open(indexWriter);
        IndexSearcher indexSearcher = new IndexSearcher(reader);
        BooleanQuery.Builder builder = new BooleanQuery.Builder();
        builder.add(new TermQuery(new Term("field","上海")), BooleanClause.Occur.MUST);
        builder.add(new TermQuery(new Term("field","建设")), BooleanClause.Occur.MUST);


        TopDocs search = indexSearcher.search(builder.build(), 10);
        Assertions.assertEquals(search.scoreDocs.length,2);

        reader.close();
        indexWriter.close();;
    }
    @Test
    public void verify() throws IOException {
        index();;
    }
}
